#include "linklist.h"
#include <string.h>

// 创建一个node
node *create_node(buf_t *buf){
    // 分配内存
    node *p = malloc(sizeof(node));
    if(NULL == p){
        printf("malloc node error\n");
        return NULL;
    }
    // 去脏
    memset(p, 0, sizeof(node));
    buf_init(&(p->buf), sizeof(arp_pkt_t));

    // p->buf = malloc(sizeof(buf_t));
    // if(NULL == p->buf){
    //     printf("malloc node->buf error\n");
    //     return NULL;
    // }
    // memset(p->buf, 0, sizeof(buf_t));
    buf_copy(&(p->buf), buf, 0);
    
    p->next = NULL;
    return p;
}

// 链表尾插
void tail_insert(node *pH, node *new){
    // 遍历到最后一个节点, next==NULL
    node *p = pH;  // 防止改动pH指向位置
    while (NULL != p->next) p = p->next;
    p->next = new;
}

// 链表头插
void top_insert(node *pH, node *new){
    new->next = pH->next;
    pH->next = new;
}

// 链表打印,这里是打印node地址,因为node的data是buf
// void print_node(node *pH){
//     node *p = pH;
//     while (NULL != p->next)
//     {
//         printf("%p -> ", p->buf);
//         p = p->next;
//     }
//     printf("%p\n", p->buf);
// }

// 清除整个链表
void clear_list(node *pH){
    node *p = pH;
    if(NULL == p) {
        printf("地址为 %p 的链表是空的\n", pH);
        return;
    }
    node *prev = 0;
    // 从头到尾
    while (NULL != p)
    {
        prev = p;
        p = p->next;
        prev->next = NULL;
        free(prev);
    }
    p = NULL;
    prev = NULL;
    pH = NULL;
}

// void delete_hdr(node *pH){
//     if(pH->next == NULL){
//         free(pH);
//         pH = NULL;
//     }else{
//         printf("地址为 %p 的链表中还有内容\n", pH);
//         clear_list(pH);
//         free(pH);
//         pH = NULL;
//     }
// }

void node_copy(void *pdst, const void *psrc, size_t len){
    node *dst = pdst;
    const node *src = psrc;
    // dst->buf = src->buf;  // 不知道为何用buf_copy不成功
    buf_copy(&(dst->buf), &(src->buf), 0);
    dst->next = src->next;
}